perm filename BEAMS.OLD[XX,LCS]6 blob
sn#220905 filedate 1976-06-22 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 C***** BEAMS, XNOTE, BAUTO, UPDATE, SLEND, POSIT *******
C00031 ENDMK
C⊗;
C***** BEAMS, XNOTE, BAUTO, UPDATE, SLEND, POSIT *******
SUBROUTINE BEAMS
INTEGER UPDN
COMMON/XRN/RN(2000)
COMMON/RINP/R(10,80),POSNT(0/99) /RMOD/RMODE2,SET4,IBEAM,
1 NOSET,STEM,STUP,NTC,PS2,RAM,RDD,IT,POS
1 /FRMT/F78F(1),FA1(1),FA5(1),IREAD /ALF/INP(72),ML
1 /PTR/PWDS(250),ITEM,LL,IS,IX
COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
COMMON R2,JAZ,CENTR,JBZ,RJQ(20),JQ(20) /STF/RSTFAC(8),RSTJ2
COMMON/SCX/RHY(4),JALPHA(30),JX,U,JZ,IRHY,JD,KA,KB,IZ
1 /SC/J,L,MK,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG
1 ,IXX,ISEMI,IQT,VX(50),IAMP,K,KN,M,MODE,IBLA
DATA BX/25./,BY/.5/,DFAC/6./,CURV/0.9/
C THESE ARE USED TO DETERMINE CURVE OF SLURS AT 63 (21700)
IF(RMODE.LT.500)GO TO 251
IF(MODE.EQ.4)RETURN
C PICKS UP SLURS ONLY WHEN USING SUBR. 'EXTRA' *********
251 INVT=-1
IF(MODE.EQ.3)GO TO 25
IF(REND.NE.0)GO TO 25
REND=3
25 DO 1500 K=1,72
IF(INP(K).EQ.'B')GO TO 22
C B=AUTOMATIC BEAMS.
IF(INP(K).NE.'*')GO TO 1500
15 INP(72)='*'
GO TO 500
1500 IF(INP(K).EQ.ISEMI)GO TO 500
GO TO 15
C ABOVE FOR 2ND LNE OF INPUT. IF LNS ENDS WITHOUT * OR ;, IT PUTS IN *
22 REREAD F78F,A,B,C
C TYPE '2B' OR '3B' ETC. FOR AUTOMATIC BEAMS. (2=DUPLE 3=TRIPLE)
IF(IREAD.NE.-1)GO TO 1122
A=B
B=C
C IREAD=-1 WHEN READING SOS FILES. (=-2 WITH ET FILES.)
1122 A=A/2.
C '2'=1 '3'=1.5 '2B 3;' MEANS THERE'S A 3 NOTE PICK-UP.
IF(STEM)STEM=0
C STEM=10 OR 20 IF ALREADY SETUP IN NOTES
K=0
N=0
J=0
INP(72)='*'
C PICKS UP RHYTHM FROM TIME WHEN MODE=2 (NOW IT =4)
IF(B.EQ.0)GO TO 122
K=B
B=0
C=0
DO 2122 NN=1,K
IF(V(NN))GO TO 3122
B=B+1
C UPDATE COUNTER
GO TO 2122
3122 N=N+1
C TO SKIP OVER RESTS
2122 C=C+ABS(V(NN))
IF(B.LE.1)GO TO 122
IF(C.GT.A)GO TO 122
C SKIPS IF PICK-UP HAS LONGER TOTAL THAN BEAM RANGE (A)
J=2
VX(1)=1
VX2=B
C PUTS BEAM ON PICK-UP IF MORE THAN ONE NOTE.
122 K=K+1
L=K
222 C=ABS(V(K))
IF(C.EQ.4./88.)GO TO 522
C CATCHES 88TH NOTES (GRACE NOTES)???
IF(V(K).GT.0)GO TO 922
1022 N=N+1
C SUBTRACTS NUMB. FOR REST.
IF(C.GE.A)GO TO 1222
1322 L=L+1
GO TO 422
1222 IF(AMOD(C,A).NE.0)GO TO 622
IF(K-L.LE.1)GO TO 522
L=L+1
GO TO 722
922 IF(C.EQ.A)GO TO 522
IF(C.GE.1)L=L+1
422 IF(K.EQ.IRHY)GO TO 322
K=K+1
5022 B=V(K)
IF(B.NE.4./88.)GO TO 2022
JMP=K
3022 IF(V(K+1).NE.4./88.)GO TO 4022
C TO BEAM GRACE NOTES WHEN IN AUTOMATIC MODE.
K=K+1
GO TO 3022
C GO BACK FOR MORE
4022 IF(K.EQ.JMP)GO TO 422
C GO AWAY IF THERE IS ONLY ONE GRACE NOTE.
CALL BAUTO(J,JMP,K,N)
C I HOPE THE ARGS. ARE OK!
IF(JMP.EQ.L)L=K
C DOES GRACE NOTE BEAM COME UNDER BIG BEAM(JMP≠L) OR NOT(JMP=L).?
GO TO 422
2022 C=C+ABS(B)
IF(B.GT.0)GO TO 1922
IF(-B.LT.A)GO TO 1022
C GO BACK TO PUT A REST UNDER A BEAM.
N=N+1
C UPDATE REST COUNTER IF IT GETS TO HERE.
1922 IF(C.LT.A-.0001)GO TO 422
IF(C.LT.A+.0001)GO TO 722
C .0001 FOR ROUNDOFF PROBLEMS
C=AMOD(C,A)
IF(K-L.LE.1)GO TO 622
CALL BAUTO(J,L,K-1,N)
622 L=K
IF(ABS(V(K)).GE.A)GO TO 77
IF(C.NE.0)GO TO 422
77 L=L+1
GO TO 422
722 IF(K.EQ.L)GO TO 522
1722 DO 1422 IT=L,K
B=V(IT)
IF(B.EQ.4./6.)GO TO 1522
IF(B.EQ..875)GO TO 1422
C .875=(8..)
IF(B.GT..75)GO TO 1522
1422 CONTINUE
C WON'T PUT BEAMS WHERE NOT LOGICAL. CATCHES QUINTS AND SEXT'S.
IF(V(L)+V(K).LT.A+.0001)CALL BAUTO(J,L,K,N)
C DOES ONLY DUPLES AT THIS POINT.
522 IF(K.LT.IRHY)GO TO 122
322 IF(J.EQ.0)RETURN
C NO BEAMS - SO GO BACK.
DO 822 K=J+1,50
C USES ONLY 68 SLOTS IN 'V'
822 VX(K)=0
J=0
GO TO 511
1522 IF(IT-1.GT.L)GO TO 1622
1822 L=IT+1
IF(L.LT.K)GO TO 1722
GO TO 522
1622 CALL BAUTO(J,L,IT-1,N)
GO TO 1822
C ALL THIS ↑↑ FOR QUARTERS IN TRIPLE TIME UNITS!
CC27 DO 26 L=1,50
CC26 VX(L)=V(L)
C BECAUSE MODE 3 IS NOW ACCENTS, ETC.
CC GO TO 511
500 REREAD F78F,VX
IF(MODE.EQ.5)NTC=NTC-1
C NTC=NUM OF NTS NOW
J=0
IF(IREAD.EQ.-1)J=1
C SKIPS LINE #S IN SOS FILES. (=-2 IS FOR ET FILES.)
511 J=J+1
N=VX(J)
JMP=1
505 L=0
K=0
POS=-10.
IF(MODE.EQ.3)GO TO 5032
C MODE 3 IS FOR ACCENTS ETC.
RN(8+IS)=0
RN(9+IS)=0
IT=0
UPDN=0
IF(MODE.EQ.5)GO TO 104
IF(STEM.EQ.0)GO TO 503
C UPDN=2=STEMS DOWN, (SLUR DIP UP) =1, OPPOSITE.
104 JA=J+1
B=VX(JA)
C THE 2ND NOTE (-=DIP DOWN ALWAYS; +100=UP ALWAYS, ORD.=AUTOMATIC)
IF(B.LT.100)GO TO 512
UPDN=2
B=B-100
IF(B.GT.100)B=100-B
C TYPE -NUM OR 200+NUM FOR DIP DOWN.
512 IF(B)UPDN=1
VX(JA)=B
IF(MODE.EQ.4)GO TO 503
BRK=AMOD(VX(J),1.)*10.
IF(BRK.EQ.0)GO TO 503
C NEXT FOR TRIPL. BRACKET, ETC. ADD DESIRED .NUM TO 1ST NUM.
RN(9+IS)=BRK+.0001
GO TO 5030
503 IF(N.GT.0)GO TO 5031
IT=-1
C6/75 POS=-1.3
CALL SLEND
C -1= SLUR INTO 1ST NOTE.
C SETS POS OF LFT SIDE (-10+9, THEN +2)
GO TO 5060
5031 IF(N.LE.NTC)GO TO 5030
C NTC=NUM OF NTS
C6/75 POS=202
CALL SLEND
C SLEND CHECKS ON END POINTS OF THIS STAFF
GO TO 504
C -1=1ST SLUR FROM NO NOTE; 99= LAST, TO NO NOTE
5032 IF(N.GT.IRHY)N=IRHY
C TRAPS ERROR OF TRYING TO PUT MARK ON NON-EXISTENT NOTE.
5030 L=L+1
502 K=K+1
IF(R(1,K).NE.1.)GO TO 502
C IS IT A NOTE?
P=R(3,K)
IF(P.EQ.POS)GO TO 502
C SKIPS DBLSTPS
POS=P
506 IF(L.LT.N)GO TO 5030
5060 IF(MODE.EQ.3)GO TO 30
C NOW SLUR STARTS
IF(JMP)GO TO 504
C JMP=-1 MEANS END NOTE OF GROUP
J=J+1
NN=VX(J)
C IF 2ND NUM IS .LE. 1ST , THEN 2-NOTE SLUR. (-1 GOES TO 1)
IF(NN.EQ.0)NN=N+1
IF(NN.EQ.0)NN=1
IF(NN)GO TO 777
IF(NN.LE.N)NN=N+1
C FOR USE WITH AUTO-BEAMS OR DIP UP. 2-NOTE SLUR OR BEAM UP.
CC777 IF(STEM)GO TO 5061
777 IF(MODE.NE.4)GO TO 5061
CC IF(MODE.NE.4)GO TO 177
IF(STEM.LE.0)GO TO 5061
C AUTOMATIC DIP DIRECTION FOR SLURS WITH AUTO. BEAMS.
177 MK=K
877 IF(R(1,MK).EQ.1)GO TO 477
MK=MK+1
GO TO 877
C FOR SLUR INTO FIRST NOTE WITH AUTO BEAMS.
477 A=19.-R(5,MK)
IF(NN.GE.0)GO TO 277
IF(A.GT.0)GO TO 377
277 IF(A.GE.0)GO TO 5061
IF(NN.LE.0)GO TO 5061
377 NN=-NN
5061 MK=N
N=IABS(NN)
M=K
JA=3
JB=4
KN=K
RB=0
IF(MODE.EQ.4)GO TO 550
IBR=6
C 6=SLUR, 7=BRACK. FOR TRIPLETS, ETC.
CC*** NOT NEEDED NOW WITH UPDN FEATURE. IF(STEM.GE.0)NN=-NN
IF(IT)GO TO 550
C IT=-1=SLUR INTO 1ST NOTE.
A=XNOTE(K)
C XNOTE IS AMOD(R(4,K),100.)
C SAVES LEVEL OF 1ST NOTE.
504 RB=2
B=AMOD(R(6,K),1.0)
IF(B.GE.0.5)RB=3.
IF(B.EQ.0.4)RB=5.
C THESE ARE FOR >(.5) AND ∧(.4) ACCENTS
IF(NN)RB=-RB
C DIP IS SET BY PARAM 7. (STEM DIR. IS AUTOMATIC)
550 RN(JA+IS)=POS
B=XNOTE(K)
IF(MODE.EQ.4)GO TO 519
C TO MAKE MINI-BEAMS ON GRACE NOTES WHEN NEEDED.
IF(MODE.NE.5)GO TO 513
SLUR=0
C A FLAG FOR LATER USE.
MB=R(5,K)/10.
CC IF(JMP.GE.0.AND.UPDN.EQ.0)GO TO 515
IF(UPDN.EQ.0)GO TO 515
IF(MB.EQ.0)MB=UPDN
C MB=0 IF 2ND NOTE IS WITHOUT STEM
IF(MB.EQ.UPDN)GO TO 515
X=6
IF(RB)X=-X
RB=RB+X
JA=3
IF(JMP)JA=6
IF(RB)GO TO 204
IF(UPDN.EQ.2)GO TO 516
204 IF(UPDN.EQ.1)GO TO 516
C ABOVE FOR VARIOUS COMBINATIONS OF STEM DIRECTIONS
RB=-RB
NN=-NN
516 IF(K.GT.1)GO TO 16
IF(IT)GO TO 513
16 IF(K.NE.NTC)GO TO 116
IF(N.GT.NTC)GO TO 513
C JUMP IF N=99, BY PASS IF K IS NOT LAST NOTE OF LINE.
116 SLUR=1.
IF(UPDN.EQ.1)SLUR=-SLUR
SLUR=SLUR*RSTJ2
RN(JA+IS)=RN(JA+IS)+SLUR
C THIS NOT DONE IF SLUR TO FIRST NOTE
GO TO 513
519 B=R(4,K)
A=R(10,K)
IF(A.EQ.0)GO TO 513
C JUMP IF IT'S NOT ON DIFF STF.
RA=RSTJ2*2.44
C NOTE WIDTH
IF(ABS(B).GE.100)RA=RA*.6
C MINI
IF(A.EQ.2)RA=-RA
C STAFF ABOVE
RN(JA+IS)=POS+RA
GO TO 513
517 IF(MB.EQ.1)GO TO 513
IF(RB)RB=-RB
GO TO 518
515 UPDN=MB
C AUTO SLUR DIP DEPENDS ON STEM DIREC. OF 1ST NOTE. (WHOLE NTS??)
IF(NN)GO TO 517
IF(MB.NE.1)GO TO 513
RB=-RB
518 NN=-NN
513 RN(JB+IS)=B+RB
JA=6
JB=5
C MK=# OF 1ST NOTE, N=END NOTE NOW
JMP=-JMP
IF(JMP.GT.0)GO TO 1503
C GO FIND RT. SIDE OF SLUR
IF(N.LE.MK)N=MK+1
C PICKS UP TYPO ERRORS
JK=0
IF(R(7,K).GE.10)JK=-1
C CHECKS FOR DOT AFTER 1ST NOTE -- FOR TIES.
GO TO 503
1503 RN(2+IS)=STAFF
IF(MODE.EQ.4)GO TO 35
RN(8+IS)=-1
RN(1+IS)=5
IF(IT)RN(4+IS)=RN(5+IS)
NN=-NN
C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
IF(MK.EQ.IRHY)GO TO 61
IF(N.EQ.1)GO TO 61
CC IF(((XNOTE(K).NE.A.OR.N-MK.GT.1).AND.IT.GE.0.
CC 1 ).OR.IT)GO TO 60
IF(IT)GO TO 60
IF(XNOTE(K).NE.A)GO TO 60
IF(N-MK.GT.1)GO TO 60
CCC IF(R(5,M).NE.R(5,K))GO TO 65
CCC FOR SLUR OVER CHROMATIC CHANGE ON SAME NOTE NAME.
C M=1ST NOTE OF SLUR, K=LAST
IF(AMOD(R(5,K),10.0).GT.0)GO TO 65
C JUMP IF LAST NOTE AS ACCI.
C JUMP IF NOT ADJACENT NOTE AT SAME PITCH AND NOT 1ST OR LAST.
61 C=9
IF(JK)C=12
IF(RN(6+IS)-RN(3+IS)-C*RSTJ2)GO TO 65
C JUMP IF SLUR IS VERY SHORT
IF(IT)A=XNOTE(K)
C IT=-1=SLUR INTO 1ST NOTE.
A=A+.7
IF(NN.GT.0)A=A-1.4
C TO RAISE OR LOWER IT .5
RN(4+IS)=A
RN(5+IS)=A
B=-2
IF(JK)B=-3
C JK=-1 WHEN NOTE IS DOTTED.
C THIS PUTS TIE BETWEEN (NOT ABOVE OR BELOW) NTS. NO STEM CHNG.
RN(8+IS)=B
IF(SLUR.EQ.0)GO TO 65
RN(3+IS)=RN(3+IS)-SLUR
RN(6+IS)=RN(6+IS)-SLUR
C PUSH SLUR BACK TO WHERE IT WAS
GO TO 65
C** 6/16/75 60 IF(STEM.GE.0)GO TO 508
60 IF(STEM.GE.0)GO TO 200
IF(MODE.EQ.5)GO TO 200
C JUMP IF SLURS**************
C NEXT IS STEM INVERTER. SKIP IF AUTOMATIC BEAMS OR 'SU' 'SD' IN USE.
JB=1
RB=10.
IF(NN)GO TO 509
C IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
RB=-RB
JB=2
509 DO 507 L=M,K
IF(R(1,L).NE.1.)GO TO 507
JA=R(5,L)/10.
IF(JA.NE.JB)GO TO 507
R(5,L)=R(5,L)+RB
INVT=0
C**********************************************
507 CONTINUE
CC508 IF(N.GT.100)GO TO 514
C**** NO LONGER USED. USE 'SD' 'SU' ** JUMP IF ONLY REVERSING STEMS.
GO TO 200
62 IF(NN)GO TO 64
IF(A.EQ.DMAX)GO TO 65
AA=B-DMAX
GO TO 63
65 AA=0
GO TO 63
64 IF(A.EQ.UMAX)GO TO 65
AA=UMAX-B
63 RA=RN(6+IS)
RB=RN(3+IS)
X=CURV+(RA-RB)/BX+ABS(RN(4+IS)-RN(5+IS))/10.
C CURVE DEPENDS ON LENGTH, TILT AND NOTES BETWEEN.
IF(AA.GT.0)X=X+AA*BY
IF(BRK.EQ.0)GO TO 66
RN(8+IS)=1
RN(3+IS)=RB-.6
RB=R(3,K+1)
C K=END NOTE OF GROUP
IF(K.EQ.IRHY)RB=200.
C ASSUMES LINE STOPS AT 200. (IT COULD BE LONGER!!)
RN(6+IS)=RA+(RB-RA)/2.
IBR=7
C CHECK THESE NUMBERS↑↑↑↑
B=RN(4+IS)
BB=RN(5+IS)
RA=1
IF(A.LT.-1)RA=2.5
C CHANGES HEIGHT. MAKES BRACK. IF N>100.
IF(NN.GT.0)RA=-RA
RN(4+IS)=B+RA
RN(5+IS)=BB+RA
X=2
66 IF(NN.GT.0)X=-X
510 RN(7+IS)=X
IF(MODE.NE.4)GO TO 2514
RN(9+IS)=0
RN(10+IS)=0
RN(IS+11)=-1
CALL UPDATE(9)
IF(JB)CALL BMX(RA)
GO TO 514
2514 L=IS
CALL UPDATE(IBR)
IF(M.EQ.K)GO TO 514
C JUMP OUT IF INTERVENING NOTE.
IF(RN(L+4).NE.RN(L+5))GO TO 514
C IS IT LEVEL?
B=-RN(IS-2)
C CHANGE DIRECTION OF DIP AFTER FIRST SLUR.
RA=1.4
IF(RN(L+8).EQ.-1)RA=RA+1.3
C IS TIE NOT BETWEEN NOTES?
IF(NN.GT.0)RA=-RA
C DIP DIRECTION. NN+ =DOWN, NN- =UP. REVERSED AFTER 1ST ONE.
RA=R(4,M)+RA
C=-2.
IF(RN(L+8).EQ.-3.)C=-3.
C PUT TIE BETWEEN NOTES ALWAYS.
JA=M
JB=K
114 JA=JA+1
JB=JB+1
IF(R(4,JA).NE.R(4,JB))GO TO 514
C LOOKS FOR PARALLEL CHORDS NOTES
IF(R(9,JA)+R(9,JB).NE.0)GO TO 514
C MAKES SURE THEY ARE CHORD NOTES.
A=R(4,JA)-RA+RN(L+5)
RN(IS)=6.
RN(IS+1)=5.
RN(IS+2)=RN(IS-7)
RN(IS+3)=RN(IS-6)
RN(IS+6)=RN(IS-3)
RN(IS+7)=B
RN(IS+8)=C
RN(IS+4)=A
RN(IS+5)=A
CALL UPDATE(IBR)
GO TO 114
514 J=J+1
A=VX(J)
N=A
C SO ITEMS NEED NOT BE IN RIGHT ORDER.
IF(MOD(N,100).GT.IRHY)A=0
IF(A.NE.0)GO TO 505
IF(J.LT.50)GO TO 514
C SOMETIMES A SLASH IS SEEN AS A 0 (WHEN PRECEDED BY SPACE).
IF(INP(72).NE.'*')GO TO 552
IF(INVT)RETURN
INVT=IS
CALL NEWR
IS=INVT
RETURN
552 IF(IREAD.NE.0)GO TO 3501
CALL TYPE
WRITE(21,4501)INP
GO TO 5501
3501 IF(IREAD.EQ.-1)READ(22,2501)J,INP
IF(IREAD.EQ.-2)READ(22,4501)INP
5501 CALL LNEND
C FOR NEW 'SCORE' CONVENTIONS
C TO READ MORE THAN 2 LINES.
GO TO 25
C FOR 2ND LINE.
4501 FORMAT(72A1)
2501 FORMAT(I,72A1)
35 RA=10.
C RA WILL=# OF TAILS, KN=1ST NOTE, K=LAST ('MOD' FOR DOTTED NOTES.)
RN(1+IS)=6
JMAX=0
IF(N-MK.EQ.1)JMAX=-1
DMAX=100.
UMAX=-DMAX
C FOR AUTO. BEAMS
JB=0
MB=0
C MB=-1 =GRACE NOTES UNDER BEAMS.
IF(ABS(R(4,KN)).GE.100.)MB=-1
DO 2 L=KN,K
IF(R(1,L).NE.1)GO TO 2
BB=R(5,L)
IF(BB.GE.10.)GO TO 12
UPDN=-1
IF(R(10,L).EQ.0)NN=19.-AA
CHORDS WILL HAVE FIXED STEM DIRECTIONS ALWAYS
GO TO 2
C SKIPS NON-NOTES AND DBLSTPS
12 IF(MB)GO TO 10
AA=BB
RB=R(4,L)
IF(ABS(RB).GE.100)GO TO 2
C SKIPS GRACE NOTES
GO TO 110
10 RB=XNOTE(L)
110 IF(RB.GT.UMAX)UMAX=RB
IF(RB.LT.DMAX)DMAX=RB
C FOR AUTO. BEAMS
RB=AMOD(R(7,L),10.0)
112 IF(RA.EQ.RB)GO TO 2
JB=-1
C FLAG FOR MIXED NUM. OF BEAMS
IF(RB.GE.RA)GO TO 2
IF(RB.NE.0)RA=RB
2 CONTINUE
C ABOVE FINDS SMALLEST # OF TAILS. NEXT FOR HGTS.
C ABOVE IS POS.2
IT=K
C FOR EXTRA BEAMS WITH CHORDS. SAVE IT IN "IT"
IF(STEM.GT.0)GO TO 577
C *****↑↑↑↑↑↑ ABOVE WAS ".NE." BEFORE 4/30/76. WHY?#@&Xαε
IF(UPDN.NE.0)GO TO 577
IF(UMAX+DMAX.GE.14)NN=-1
CXX IF(STEM.GT.0)NN=10.-STEM
C SETS AUTO. BEAMS' STEM DIRECTION.
577 X=10
IF(NN)X=20
IF(MB)RA=2
C 2 BEAMS ON GRACE NOTES ALWAYS
X=X+RA
C # OF BEAMS. IT'S PUT IN DOWN BELOW 550.
200 M=KN
207 L=M+1
IF(R(1,L).NE.1)GO TO 307
IF(R(9,L).NE.0)GO TO 307
M=M+1
GO TO 207
C FOR HEIGHTS OF DBL STPS, ETC.
307 A=XNOTE(M)
C A=NOTE 1.
UMAX=A
DMAX=A
C UP MAX. NOTE #, DOWN MAX. NOTE #.
407 M=K+1
IF(R(1,M).NE.1)GO TO 103
IF(R(9,M).NE.0)GO TO 103
C FINDS DBL+ STP ON LAST OF BEAM
K=M
GO TO 407
103 DO 3 M=KN,K
IF(R(1,M).NE.1)GO TO 3
IF(M.EQ.K)GO TO 107
IF(R(10,M).NE.0)GO TO 107
IF(R(9,M+1).EQ.0)GO TO 3
C IGNORE LOWER (OR UPPER) NOTES OF CHORDS - IN RE. UP-DOWN FEATURE.
107 IF(MB)GO TO 7
C SKIP IF DEALING WITH GRACE NOTE BEAMS. (MB=-1)
IF(ABS(R(4,M)).GE.100)GO TO 3
C SKIPS NON-NOTES
7 B=XNOTE(M)
CC IF(STEM.GT.0)GO TO 55
CC IF(MODE.NE.5)GO TO 677
CC IF(STEM.EQ.0)GO TO 55
IF(MODE.EQ.5)GO TO 55
677 Y=R(5,M)
33 IF(NN.GT.0)GO TO 5
C JUMP IF STEM UP
IF(Y.GE.20.)GO TO 55
IF(Y.LT.10.)GO TO 55
R(5,M)=Y+10.
GO TO 551
5 IF(Y.LT.20.)GO TO 55
R(5,M)=Y-10.
C************************
C STEM UP
551 INVT=0
55 IF(B.LE.UMAX)GO TO 13
C ↑↑↑↑↑↑↑↑ WAS .LT. !!!!! 5/76
UMAX=B
IF(JMAX)GO TO 3
IF(M.EQ.KN)GO TO 3
IF(M.EQ.K)GO TO 3
UMAX=UMAX+1
GO TO 3
13 IF(B.GT.DMAX)GO TO 3
DMAX=B
IF(JMAX)GO TO 3
IF(M.EQ.KN)GO TO 3
IF(M.EQ.K)GO TO 3
DMAX=DMAX-1
3 CONTINUE
C LOOKS FOR LOWER AND HIGHER NOTES THAN NOTE 1.
4 IF(MODE.EQ.5)GO TO 62
K=IT
C FOR EXTRA BEAMS WITH CHORDS. K WAS SAVED IN "IT"
AA=A
BB=B
C=1
IF(X.LT.20.)GO TO 48
C JUMP IF STEM IS UP
CALL EXCH(AA,BB)
C=-C
CALL EXCH(UMAX,DMAX)
48 IF(AA.LT.BB)GO TO 45
IF(UMAX.EQ.A)GO TO 46
47 A=UMAX-C
B=A
GO TO 444
46 IF(UMAX.GT.AA)GO TO 47
GO TO 49
45 IF(UMAX.NE.B)GO TO 47
49 A=AA
B=BB
IF(X.GE.20)CALL EXCH(A,B)
444 RN(2+IS)=STAFF
446 DIS=(RN(IS+6)-RN(IS+3))/DFAC
C FOR TILT LATER -- DFAC IS IN DATA
IF(ABS(A-B).LT.DIS)GO TO 14
C=C*DIS
C NEW TILT ROUTINE. CONSIDERS DISTANCE:HEIGHT
C LIMITS SLOPE OF BEAM
IF(X.GE.20)GO TO 141
IF(B.GT.A)GO TO 140
142 B=A-C
GO TO 14
141 IF(B.GT.A)GO TO 142
140 A=B-C
14 IF(MB.EQ.0)GO TO 143
C NEXT FOR GRACE NOTE BEAMS (MB=-1)
C=100
IF(A)C=-C
A=A+C
143 RN(4+IS)=A
RN(5+IS)=B
C MAKES HORIZONTAL BEAMS IF PATTERN IS UP-DOWN.
C*******?????? RN(6+IS)=R(3,K)
C ABOVE IS POS.2
GO TO 510
C NEXT IS FOR ACCENTS AND OTHER MARKS
30 CALL MARKS(RA)
J=J+1
IF(RA.EQ.99)RA=VX(J)
C IF STEM IS DOWN OR THERE ARE NOTES BELOW(DBL STP), POSITION
C OF ACCENT WILL BE INVERTED.
IF(RA.LT.40)GO TO 304
NN=6
BB=-4
A=3
B=3
IF(R(4,K).LT.3)BB=R(4,K)-7.5
C LOWERS ITEM IF NOTE BELOW STAFF. BUT IS 'K' ALWAYS OK HERE??????
IF(RA.LT.99)GO TO 305
C NEXT FOR CRESC. & DECRSC. LINES<,>. TYPE /NT1 C+ NT2/ OR /N1.d C- N2.d/
NN=8
BB=BB+2.5
A=5
B=4
RN(IS+7)=RA-200
C MAKES ZERO OR -1 IN P7
RA=50
C ADDS A NEW ITEM. MP, PP, CRESC., ETC. --CODE 3
305 RN(IS)=A
RN(IS+1)=B
RN(IS+2)=STAFF
C PUTS MF, ETC. BETWEEN NOTES. (I HOPE) SEE 'FUNCTION POSIT' BELOW
RN(IS+3)=POSIT(VX(J-1))
C '+2' PUSHES IT TO RIGHT. MAYBE CHANGE ORIGINAL POSITIONS??
RN(IS+4)=BB
C DIST. BELOW STAFF
RN(IS+5)=RA
C THE CODE NUM IN 'CLEFS' LIST
IS=IS+NN
IF(NN.EQ.6)GO TO 514
J=J+1
RN(IS-2)=POSIT(VX(J))
C THIS IS P6 (POS2 FOR CRESC. LINES)
GO TO 514
304 RB=R(6,K)
B=10.
IF(RA.EQ.6)RA=26.
C TEMPORARY CHANGE FOR FERMATA*******
IF(RA.GT.10.)RA=RA/10.
A=ABS(AMOD(RB,1.))
IF(A.EQ.0)GO TO 301
IF(RA.GT.3)GO TO 303
RB=FLOAT(IFIX(RB))
RA=RA+A/10.
C THIS PUTS 2-DIGIT CODE BEFORE 1-DIGIT CODE.
GO TO 301
303 IF(A.LT..3)GO TO 302
B=100.
GO TO 301
302 B=1000.
301 IF(RB.LT.0)RA=-RA
R(6,K)=RB+RA/B
GO TO 514
C USES 4-7,9,11-13 FOR ACC. > FERM. DOT - DNBOW UPBOW HARM.
C NOTE#,ACCENT#/N,A/N,A*
END
CF FUNCTION XNOTE(J)
CF COMMON/XRN/RN(4000)
CF DIMENSION R(10,80)
CF EQUIVALENCE (R,RN(3001))
CF XNOTE=AMOD(R(4,J),100.)
CF END
CF SUBROUTINE BAUTO(J,L,K,N)
C FOR AUTOMATIC BEAMS.
CF COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
CF J=J+2
CF V(J-1)=L-N
CF V(J)=K-N
CF END
CF SUBROUTINE UPDATE(I)
CF COMMON /PTR/PWDS(250),ITEM,LL,IS,IX /XRN/RN(4000)
CF RN(IS)=I
CF IS=IS+I+3
CF END
C SUBROUTINE SLEND
C INTEGER PWDS
C TO FIND END POINTS OF STAVES
C COMMON/XRN/RN(2000),IT,POS,RA,NN,JB,RB,A,B,JMP,JK,C,DMAX,
C 1 UMAX,AA,JMAX,X,Y,BB,RNX(1982)
1/SCM/V(78),I,LCNT,STAFF,LIST(200),REND/PTR/PWDS(250),ITEM,LL,IS,IX
C DO 1 K=1,ITEM
C L=PWDS(K)
C IF(RN(L+1).NE.8)GO TO 1
C FOUND A STAFF
C IF(RN(L+2).NE.STAFF)GO TO 1
C GOT THE RIGHT ONE
C IF(IT)GO TO 2
C POS=202
C NOW CHECK LEFT SIDE OF STAFF
C IF(RN(L).LT.4)RETURN
C P6 WASN'T MENTIONED - SO IT =200
C POS=RN(L+6)+2
C IF(POS.EQ.2)POS=202
C RETURN
C2 POS=RN(L+3)-2.3
C RETURN
C1 CONTINUE
C END
C FUNCTION POSIT(V)
C COMMON/XRN/RN(4000)
C DIMENSION POSNT(0/82)
C EQUIVALENCE (POSNT,RN(3801))
C 1,(A,RN(3884)),(K,RN(3885))
C IF(V)V=-V
C REREAD OR SOMETHING MAKES /1 C- 2/ GIVE A -2 FOR LAST NUM.!!!???
C K=V
C A=POSNT(K)
C POSIT=A+(POSNT(K+1)-A)*AMOD(V,1.0)
C TYPE /2.3 -- FOR POSITION BETWEEN NTS 2 AND 3. ETC.
C END